package sessionBeans;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import dtos.ModuloDTO;
import dtos.ServiciosModuloDTO;
import entities.Modulo;
import entities.ServiciosModulo;

/**
 * Session Bean implementation class AdministradorModuloBean
 */
@Stateless
@LocalBean
public class AdministradorModuloBean implements AdministradorModulo {

	@PersistenceContext(unitName="CRM")
	private EntityManager em;

	public AdministradorModuloBean() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public Modulo buscarModulo(int codigo) {
		// TODO Auto-generated method stub
		Query q = em.createQuery("from Modulo a where a.id = :codigo");
		q.setParameter("codigo", codigo);
		Modulo mod = null;
		List<Modulo> mods = (List<Modulo>) q.getResultList();
		if(!mods.isEmpty()){
			mod = mods.get(0);
		}
		return mod;
	}

	@Override
	public List<ServiciosModulo> getAllServiciosModulo(int idModulo) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<ModuloDTO> getAllModulo() {
		// TODO Auto-generated method stub
		Query q = em.createQuery("from Modulo a");
		List<Modulo> resultMod = (List<Modulo>) q.getResultList();
		List<ModuloDTO> resultadoModulo = new ArrayList<ModuloDTO>();
		for (Modulo aux :resultMod){
			ModuloDTO modDTO = new ModuloDTO();
			resultadoModulo.add(modDTO.parseDTO(aux));
		}
		return resultadoModulo;
	}
	
	public List<Modulo> buscarTipoModulos(String codigo) {
		// TODO Auto-generated method stub
		Query q = em.createQuery("from Modulo a where a.nombre like :codigo");
		q.setParameter("codigo", "%"+codigo+"%");
		List<Modulo> resultMod = (List<Modulo>) q.getResultList();
		return resultMod;
	}

	@Override
	public ServiciosModulo buscarServicio(int servicio, int idModulo) {
		// TODO Auto-generated method stub
		Query q = em.createQuery("select se from Modulo m inner join m.servicios se where se.servicio = :servicio and m.id = :idModulo");
		q.setParameter("servicio", servicio);
		q.setParameter("idModulo", idModulo);
		ServiciosModulo resultMod = null;
		List<ServiciosModulo> lista = q.getResultList();
			if(!lista.isEmpty()){
				resultMod = lista.get(0);
			}
		return resultMod;
	}
	
	@Override
	public ServiciosModuloDTO buscarServicioDTO(int servicio, int idModulo) {
		// TODO Auto-generated method stub
		Query q = em.createQuery("select se from Modulo m inner join m.servicios se where se.servicio = :servicio and m.id = :idModulo");
		q.setParameter("servicio", servicio);
		q.setParameter("idModulo", idModulo);
		ServiciosModulo resultMod = null;
		ServiciosModuloDTO res = null;
		List<ServiciosModulo> lista = q.getResultList();
		if(!lista.isEmpty()){
			resultMod = lista.get(0);
			res = new ServiciosModuloDTO();
			res = res.parseODTO(resultMod);
		}
		return res;
	}

	@Override
	public ModuloDTO getActivo(String modulo) {
		// TODO Auto-generated method stub
		Query q = em.createQuery("from Modulo a where a.nombre like :codigo and a.activo = 1");
		q.setParameter("codigo", "%"+modulo+"%");
		Modulo modu = null;
		ModuloDTO mod = new ModuloDTO();
		List<Modulo> mods = (List<Modulo>) q.getResultList();
		if(!mods.isEmpty()){
			modu = mods.get(0);
			mod = mod.parseDTO(modu);
		}
		return mod;
	}

	public boolean updateModulo(ModuloDTO mod){
		Modulo m = this.buscarModulo(mod.getId());
		if(m!=null){
			m.setIp(mod.getIp());
			m.setNombre(mod.getNombre());
			m.setActivo(mod.isActivo());
			List<ServiciosModulo> mods = new ArrayList<ServiciosModulo>();
			int i=0;
			for(ServiciosModuloDTO serv : mod.getServicios()){
				ServiciosModulo s = this.buscarServicio(serv.getServicio(), m.getId());
				//chequear que pasa si existe o no con el tema del id (generated)
				if(s!=null){
					s.setPath(serv.getPath());
					s.setServicio(serv.getServicio());
				}else{
					s = new ServiciosModulo();
					s.setPath(serv.getPath());
					s.setServicio(serv.getServicio());
					
				}
				mods.add(s);
			}
			m.setServicios(mods);
			this.em.merge(m);
			return true;
		}
		return false;
	}

}
